package com.qf3.service.impl;

import com.alibaba.druid.pool.DruidDataSource;
import com.qf3.service.UserService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * Component 有三个衍生注解，这三个衍生注解的含义是一样的，只是用这三个衍生注解可以清晰知道这个bean对象属于三层模型中的哪一层
 *  Controller -- 用来标识web层的对象
 *  Service -- 用来表示service层的对象
 *  Repository -- 用来表示dao层对象（持久层对象）
 */

//@Component("userService") //相当于<bean>标签
//@Component  //当没有显示指定名称时，使用的是简单类名，首字母小写作为对象名称 --- userServiceImpl
@Service
@Scope("singleton") //控制对象是否为单例，默认是单例 prototype就是多例
//@Lazy // 表示这个对象是懒加载
public class UserServiceImpl implements UserService {

    @PostConstruct  //相当于xml中的init-method属性,在对象创建完后，执行的初始化方法
    public void init(){
        System.out.println("init....");
    }

    @PreDestroy //相当于xml中的destroy-method属性，在对象销毁之前执行。
    public void des(){
        System.out.println("destroy....");
    }


//    @Bean("druidDs") //对于第三方jar包中的对象，我们没有办法在三方的类上加上组件注解，只能用这种方式将其添加到spring容器中
    @Bean  //当使用这个注解没有给定名称时，方法名即为这个对象的名称 -- getDs   //相当于工厂模式的bean注入
    public DruidDataSource getDs(){
        DruidDataSource ds = new DruidDataSource();
        return ds;
    }

    /*
        思考： SqlSessionFactory
              SqlSession
     */
}
